# 安装实验性LangChain包（如果尚未安装）
# pip install langchain-experimental

# 导入语义分割器 - 这是LangChain的实验性功能，用于基于语义相似度的文本分割
from langchain_experimental.text_splitter import SemanticChunker
from langchain_huggingface import HuggingFaceEmbeddings

# 示例：semantic_split.py
# 这是一个演示如何使用语义分割器对长文档进行智能分割的示例

# 读取知识库文件
# 使用utf-8编码确保中文字符正确读取
with open("./llm_langchain_data/knowledge.txt", encoding="utf-8") as f:
    knowledge = f.read()

# 初始化HuggingFace嵌入模型
embeddings = HuggingFaceEmbeddings(
    model_name="D:/models/BAAI_bge-small-zh-v1.5",
    model_kwargs={'device': 'cpu'}
)

# 创建语义分割器实例
# embeddings: 使用的嵌入模型，用于计算文本片段的语义向量
# breakpoint_threshold_type: 分割点阈值类型，可选 "percentile"（百分位数）或 "standard_deviation"（标准差）
#   - "percentile": 基于百分位数确定分割阈值
#   - "standard_deviation": 基于标准差确定分割阈值
# breakpoint_threshold_amount: 阈值量，当使用percentile时表示百分位数（0-100），这里50表示中位数
#   这个参数控制分割的粒度：
#   - 值越小，分割越细致（产生更多小片段）
#   - 值越大，分割越宽松（产生更少但更大的片段）
text_splitter = SemanticChunker(
    embeddings,
    breakpoint_threshold_type="percentile",
    breakpoint_threshold_amount=50
)

# 使用语义分割器对知识文本进行分割
# create_documents方法将输入文本列表分割成多个Document对象
# 每个Document对象包含一个文本片段及其元数据
docs = text_splitter.create_documents([knowledge])

# 打印第一个分割后的文档内容
# page_content属性包含分割后的文本内容
print("第一个分割片段的内容：")
print(docs[0].page_content)
print(f"\n总共分割成 {len(docs)} 个片段")

# 可选：查看所有分割片段的基本信息
print("\n所有分割片段信息：")
for i, doc in enumerate(docs):
    print(f"片段 {i+1}: 长度={len(doc.page_content)} 字符")
    # 如果需要查看前几个字符，可以取消下面的注释
    # preview = doc.page_content[:100] + "..." if len(doc.page_content) > 100 else doc.page_content
    # print(f"  预览: {preview}")